身為一個韭菜,進來賭場還是要了解一下牌局的遊戲規則,比如說股票每分每秒都可以交易,有分成內盤成交與外盤成交,以一分鐘形成
RSI 是以某段時間,股價”平均漲幅”與”平均跌幅”所計算出來的數值,可看出股價觀測時間內股票價格強勢或弱勢的指標。
RSI = ( 上升平均數/(上升平均數+下跌平均數) ) × 100
根據公式我們可以得到下面結論:
RSI的範圍一定在0-100之間。
RSI越大,代表過去『漲的機率』越大。
現在我們來假設實作均線RSI順勢策略,抓最近14根K棒去做運算,突破70則市價買進,跌破30則市價賣出
好在 talib 已經有實作 RSI 方法,我們不用再寫計算公式直接套用即可
talib.RSI(df.Close) # 天數參數採用預設值 14 根 K棒
from numpy import append
import pandas as pd
import shioaji
import talib
...
minute_close = pd.Series()
api.quote.subscribe(
api.Contracts.Stocks["2330"],
quote_type = sj.constant.QuoteType.Tick, # or 'tick'
version = sj.constant.QuoteVersion.v1 # or 'v1'
)
@api.quote.on_quote
def quote_callback(topic: str, quote: dict):
print(f"Topic: {topic}, Quote: {quote}")
# 紀錄前14個close
for i in range(0,14):
minute_close = minute_close.append(pd.Series(
[quote['Close'][0]],
index=[pd.to_datetime(quote['Time'], unit='ns')]
))
time.sleep(60)
# 開始算RSI
for i in range(0,700):
# 存到分k收盤價的series
minute_close = minute_close.append(pd.Series(
[quote['Close'][0]],
index=[pd.to_datetime(quote['Time'], unit='ns')]
))
# 計算rsi
rsi = talib.RSI(minute_close)
# 觸發訊號判斷
if rsi <= 30 and rsi >= 0:
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print("Current Time =", current_time, "BUY AT ", quote['Close'][0])
if rsi >= 70:
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print("Current Time =", current_time, "SELL AT ", quote['Close'][0])
time.sleep(60)
照理說應該會出現
Response Code: 200 | Event Code: 16 | Info: MKT/*/TSE/2330 | Event: Subscribe or Unsubscribe ok
MKT/idcdmzpcr01/TSE/2330
{
'AmountSum': [1688787000.0],
'Close': [593.0],
'Date': '2021/07/01',
'TickType': [2],
'Time': '09:10:20.628620',
'VolSum': [2837],
'Volume': [1]
}
Current Time = 10:30:41 BUY AT 602.0
簡單的策略寫出來之後,就要思考一下這個策略的可行性,需要拿過去的資料測試看看是否如預期
RSI指標的另個判斷買進訊號或賣出訊號的方式,是利用短週期的RSI波動會較常週期的波動來的劇烈,
『短週期的RSI』向上突破『長週期的RSI』,稱為黃金交叉,是買進訊號。
『短週期的RSI』向下跌破『長週期的RSI』,稱為死亡交叉,為賣出訊號。
那麼明天就試著研究看看怎麼跑回測,雖然目前的策略比較想用在當日沖銷中,不知道每天的沖銷是否會有所不同,中秋節過後就每天記錄一下這個策略的可行性吧!
參考:
什麼是 RSI 相對強弱指標?使用時要注意什麼?四大解讀一次看!